#include <iostream>
using namespace std;

int main() {
    int j = 10;
    auto by_val_lambda = [=] { return j + 1; };
    auto by_ref_lambda = [&] { return j + 1; };
    cout << "by_val_lambda: " << by_val_lambda() << endl;
    cout << "by_ref_lambda: " << by_ref_lambda() << endl;

    ++j;
    cout << "by_val_lambda: " << by_val_lambda() << endl;
    cout << "by_ref_lambda: " << by_ref_lambda() << endl;

    int i = 1;
    // auto by_val_lambda = [=] { return ++i; };
    auto by_ref_lambda01 = [&] { return ++i; };
    cout << "by_ref_lambda01: " << by_ref_lambda01() << endl;
    cout << "i = " << i << endl;

    return 0;
}

/*
    为什么第三个输出不是12呢？
    在by_val_lambda中，j被视为一个常量，一旦初始化后不会再改变（可以认为之后只是一个跟父作用域中j同名的常量），
    而在by_ref_lambda中，j仍然在使用父作用域中的值。所以，在使用Lambda函数的时候，如果需要捕捉的值成为Lambda函数的常量，
    我们通常会使用按值传递的方式捕捉；相反的，如果需要捕捉的值成成为Lambda函数运行时的变量，则应该采用按引用方式进行捕捉。
*/
